home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / node_partition1.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  2KB  |  87 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  node_partition1.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_NODE_PARTITION_H
  16. #define LEDA_NODE_PARTITION_H
  17.  
  18. #include <LEDA/graph.h>
  19.  
  20.  
  21. class node_partition {
  22.  
  23. public:
  24.  
  25. void init(const graph& G) 
  26. { init_node_data1(G,nil); 
  27.   node v;
  28.   forall_nodes(v,G) v->data[0] = 1;
  29. }
  30.  
  31.  node_partition(const graph& G) { init(G); }
  32. ~node_partition()               {}   
  33.  
  34. /*
  35. node find(node v) 
  36. { node r = v;
  37.   while (r->data[1]) r = node(r->data[1]); 
  38.   while (v->data[1]) 
  39.   { node u = v;
  40.     v = node(v->data[1]); 
  41.     u->data[1] = r;
  42.    }
  43.   return r;
  44.  } 
  45. */
  46.  
  47. node find(node v) 
  48. { while (v->data[1]) v = node(v->data[1]); 
  49.   return v;
  50.  }
  51.  
  52. int  same_block(node v, node w)   { return find(v) == find(w); }
  53.  
  54. void union_blocks(node v, node w) 
  55. { node x = find(v);
  56.   node y = find(w);
  57.   if (x != y) 
  58.     if (int(x->data[0]) <  int(y->data[0]))
  59.       { x->data[1] = y; 
  60.         (int&)y->data[0] += int(x->data[0]);
  61.        }
  62.     else
  63.       { y->data[1] = x; 
  64.         (int&)x->data[0] += int(y->data[0]);
  65.        }
  66.     
  67. }
  68.  
  69. void set_inf(node v, node w) 
  70. { if (v->data[1])
  71.   { node r = find(v); 
  72.     v->data[1] = nil; 
  73.     r->data[1] = v; 
  74.     v->data[0] = r->data[0];
  75.    }
  76.  }
  77.  
  78.  
  79. node operator()(node v) { return find(v); }
  80.  
  81.  
  82. };
  83.  
  84.  
  85. #endif
  86.